package pe.edu.claretiano.admisionmatricula.admision.managedbean;

import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import pe.edu.claretiano.admisionmatricula.admision.service.ResultadoAdmisionService;
import pe.edu.claretiano.admisionmatricula.admision.serviceimpl.ResultadoAdmisionServiceImpl;
import pe.edu.claretiano.admisionmatricula.bean.Matricula;
import pe.edu.claretiano.admisionmatricula.bean.ResuladoAdmision;
import pe.edu.claretiano.admisionmatricula.bean.Vacante;
import pe.edu.claretiano.admisionmatricula.util.Utilitario;

@ManagedBean(name = "admitidoManagedBean")
@SessionScoped
public class ResultadoAdmisionManagedBean {
	private Matricula matricula;
	private Vacante vacante;
	private ResultadoAdmisionService servicioResultadoAdmision;
	private List<ResuladoAdmision> lstResultadoAdmision = new ArrayList<ResuladoAdmision>();
	private ResuladoAdmision postulante = new ResuladoAdmision();
	private List<ResuladoAdmision> lstResultadoEvaluacion;
	private String tipo;
	private int codigoAlumno;
	
	public ResultadoAdmisionManagedBean() {

		servicioResultadoAdmision = new  ResultadoAdmisionServiceImpl();
		matricula = new Matricula();
		vacante = new Vacante();
	}
	
	public void consultarPostulantes(){
		
		vacante = servicioResultadoAdmision.obtenerVacante(matricula);
		lstResultadoAdmision = new ArrayList<ResuladoAdmision>();
		postulante = new ResuladoAdmision();
		lstResultadoEvaluacion = new ArrayList<ResuladoAdmision>();
		lstResultadoAdmision = servicioResultadoAdmision.obtenerPostulantes(matricula);
		
		if(lstResultadoAdmision.size() > 0){
			codigoAlumno = lstResultadoAdmision.get(0).getCodigoPostulante();
			ResuladoAdmision bean;
			int codigoPost;

			for(int i=0; i< lstResultadoAdmision.size(); i++){
				bean = lstResultadoAdmision.get(i);
				codigoPost = bean.getCodigoPostulante();
				tipo = bean.getTipoEvaluacion();
				
				if(codigoAlumno == codigoPost){
					armarLista(bean);
				}else{
					Double ponderado = (postulante.getNotaAcademica()*0.67) + (postulante.getNotaPsicologica()*0.27) + (postulante.getNotaEntrevista()*0.06);
					postulante.setPromedio(ponderado);
					lstResultadoEvaluacion.add(postulante);
					postulante = new ResuladoAdmision();
					armarLista(bean);
					codigoAlumno = codigoPost;
				}
				
				if(i == lstResultadoAdmision.size()-1){
					Double ponderado = (postulante.getNotaAcademica()*0.67) + (postulante.getNotaPsicologica()*0.27) + (postulante.getNotaEntrevista()*0.06);
					postulante.setPromedio(ponderado);
					lstResultadoEvaluacion.add(postulante);
					
				}
					
			}
		}
	}
	
	public void armarLista(ResuladoAdmision bean){
		
		if(postulante.getNombresPostulante() == null){
			postulante.setCodSolAdmision(bean.getCodSolAdmision());
			postulante.setNombresPostulante(bean.getNombresPostulante());
			postulante.setCodigoAlumno(bean.getCodigoAlumno());
			postulante.setCondicionPost(bean.getCondicionPost());
			postulante.setCodigoPostulante(bean.getCodigoPostulante());
			postulante.setNotaAcademica(0);
			postulante.setNotaPsicologica(0);
			postulante.setNotaEntrevista(0);
		}
		
		if(tipo.equals("ACADEMICO")){
			postulante.setNotaAcademica(bean.getNotaEvaluacion());
		}else if (tipo.equals("PSICOLOGICO")){
			postulante.setNotaPsicologica(bean.getNotaEvaluacion());
		}else if (tipo.equals("ENTREVISTA")){
			postulante.setNotaEntrevista(bean.getNotaEvaluacion());
		}
	}
	
	public void determinarAdmitidos(){
		if(lstResultadoAdmision.size()>0){
			int disponibilidad = vacante.getCantDisponible();
			double mayor = 0.0;
			int codigo = 0;
			ResuladoAdmision admitido = new ResuladoAdmision();
			List<ResuladoAdmision> lstAdmitidos = lstResultadoEvaluacion;
			String mensaje = "";
			Integer tipoMensaje = 0;
			
			if(lstResultadoEvaluacion.size()>0){
				for(int i = 0; i< disponibilidad; i++){
					for(int j = 0; j<lstAdmitidos.size(); j++){
						double nota = lstAdmitidos.get(j).getPromedio();
						if(nota > mayor){
							mayor = nota;
							admitido = lstAdmitidos.get(j);
							codigo = j;
						}	
					}
					
					if(lstAdmitidos.size()> 0){
						//admitir alumno
						String codigoAlum = "CL002014" + admitido.getCodigoPostulante();
						admitido.setCodigoAlumno(codigoAlum);
						servicioResultadoAdmision.actualizarAdmitir(admitido);
						mayor = 0.0;
						//eliminar postulante de la lista
						lstAdmitidos.remove(codigo);
					}
					
				}
				
				if(lstAdmitidos.size()>0){
					for(int j = 0; j<lstAdmitidos.size(); j++){
						servicioResultadoAdmision.actualizarNoAdmitir(lstAdmitidos.get(j));
					}
				}
				
				consultarPostulantes();
				tipoMensaje = 3;
				mensaje = "Postulantes admitidos satisfactoriamente";
				
				Utilitario.showFacesMessage(mensaje, tipoMensaje);
		   }
			
		}
		
		
	}
	
	public void  cancelar(){
		vacante = new Vacante();
		matricula = new Matricula();
		lstResultadoEvaluacion = new ArrayList<ResuladoAdmision>();
		lstResultadoAdmision = new ArrayList<ResuladoAdmision>();
		tipo = "";
		String mensaje = "";
		Integer tipoMensaje = 0;
		Utilitario.showFacesMessage(mensaje, tipoMensaje);
	}
	
	public Matricula getMatricula() {
		return matricula;
	}
	public void setMatricula(Matricula matricula) {
		this.matricula = matricula;
	}
	public Vacante getVacante() {
		return vacante;
	}
	public void setVacante(Vacante vacante) {
		this.vacante = vacante;
	}

	public List<ResuladoAdmision> getLstResultadoEvaluacion() {
		return lstResultadoEvaluacion;
	}

	public void setLstResultadoEvaluacion(
			List<ResuladoAdmision> lstResultadoEvaluacion) {
		this.lstResultadoEvaluacion = lstResultadoEvaluacion;
	}
	
	

}
